package com.tedu.review.day02;

/**
 * 普通类 √
 * 抽象类=抽象方法 关键字abstract
 * 只有行为的概念 没有具体实现行为
 *
 * 与面向对象的多态有绝对关系
 * 产生子类【实现类】同时具备实现的属性和方法
 *
 * 什么情况下使用？
 * 复杂项目时，需要在不同类中实现，不同功能首选抽象类【Android常用】
 *
 * 定义抽象类
 * 修饰符 abstract class 类名{} 抽象类本身没有任何意义
 * 创建抽象类中必须存在抽象方法
 * 修饰符abstract 返回值 方法名（）； 定义抽象的方法 提供给子类使用
 *
 * 抽象类实例化
 * 必须使用多态，向上造型，自身无法实例化 子类【实现类】
 *
 * 定义 使用 注意
 *
 *抽象类使用注意:抽象类和抽象方法必须使用abstract关键字修饰
 * 可以定义静态属性、静态方法需要加空{}，不可以定义抽象属性
 * 可以存在构造器、不可以定义静态抽象方法、静态抽象属性
 * 可以存在内部类:静态内部类，抽象类继承抽象类
 * Java只允许单继承，实现只需要继承子抽象类
 * final不能修饰抽象方法
 *
 *
 */

abstract/*static*/ class Animals {//①可以使用static修饰

    //类的定义：修饰符[abstract|static] class 类名
    public abstract void say();//抽象方法：没有任何实现

    //②定义修饰final[锁死]的抽象方法 ×
//实现类：子类 继承抽象类 完成：抽象类方法
    //③定义抽象属性X|定义静态属性√
    //abstract int i;
    static int i; //声明未赋值
    // ④定义抽象静态属性×
    //abstract static int j;
    //⑤定义静态抽象方法 X语法:修饰符[static|abstract] 返回值方法名
    // public static abstract void eat();
//⑥定义静态方法√需要加代码块{}一定空
    public static void eat() {};
    //⑦可以存在内部类，可以存在静态内部类
    public static class Sos{}
    //⑧抽象类存在构造器

    public Animals() {
    }
}
//⑨抽象类可以继承抽象类吗 √
abstract class Thing extends Animals{
    //成员变量
    protected abstract int result();
}
//实现类:子类 继承抽象类完成:抽象类方法
//⑩实现类【子类】不能继承俩抽象类，但是实现最终继承【子】抽象类
    class People extends Animals {
        public void say() {System.out.println("人--说话");}
    }


//实现类:假设animals有俩抽象方法 请问子类需要实现抽象类全部抽象方法
class Monkey extends Animals{
    public void say() {
        System.out.println("猴--说话");
    }
}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象---实例化【创建对象】--多态：向上造型
        Animals a=new People();
        a.say();

        Animals a1=new Monkey();
        a1.say();
            }
}
